package main

import "fmt"

// defer执行顺序和调用顺序相反，类似于栈后进先出(LIFO)。
//
// defer在return之后执行，但在函数退出之前，defer可以修改返回值。下面是一个例子：
func test1() int {
	i := 0
	defer func() {
		fmt.Println("defer1")
	}()
	defer func() {
		i += 1
		fmt.Println("defer2")
	}()
	return i
}

// 上面这个例子中，test返回值并没有修改，这是由于Go的返回机制决定的，执行Return语句后，Go会创建一个临时变量保存返回值。如果是有名返回（也就是指明返回值func test() (i int)）
func test2() (i int) {
	i = 0
	defer func() {
		i += 1
		fmt.Println("defer2")
	}()
	return i
}

func main() {
	fmt.Println("return", test1())
	fmt.Println("return", test2())

}
